#include "ImageRgb.h"
#include "Segment2D.h"
#include "DiskXFile.h"
#include "xtprobeImageDiskXFile.h"
#include "Point2D.h"
#include <CmdLine.h>
#include "tp1.h"

using namespace Torch;

Profil::Profil (char *name){
    //image_file_name = name;
    image = new ImageRgb();
    image->setBOption("verbose",true);
    //lecture du fichier sur le disque

    ImageDiskXFile *image_file = new xtprobeImageDiskXFile(name,"r");
    //chargement de l'image
    
    image->loadImageXFile(image_file);
	// on libére l'espace mémoire
    delete image_file;
    
} 	

Profil::~Profil(){
}



ImageRgb* Profil::whiteImage(){
  //le profil a une hauteur maximale egale a 255 , et sur l'axe des x a une longueur maximale egale a la largeur de l'image 
  ImageRgb *img = new ImageRgb(image->width,255);
  int n = 0;

  // rend la couleur blanche
  
  for(n=0;n<img->real_image_size;n++){
    img->pixmap[n * 3] = Profil::WHITEColor;
    img->pixmap[n * 3 + 1] = Profil::WHITEColor;
    img->pixmap[n * 3 + 2] = Profil::WHITEColor;
  }
  
  return img;
}


int* Profil::readColor(int index,int color){
  int t = 0;
  int ligne = index -1; 
  //recuperation de l'image sous forme de matrice
  real *donnee = image->data; 
  int *liste_Of_Color = (int*)malloc(sizeof(int)*image->width);
  if(color == 0)
    for(t=0;t<image->width - 1; t++)// On fait 255 ,oins cette valeurs parce l'image est représenté du haut vers le bas 
	// il faut donc retrancher 255 a chacune des valeurs pour avoir la valeur correspondante du bas vers le haut
      liste_Of_Color[t] = 255 - donnee[image->width*ligne*3 + t*3];
  else
    if(color == 1)
      for(t=0;t<image->width - 1;t++)
	liste_Of_Color[t] = 255 - donnee[image->width*ligne*3 + 1 + t*3];
    else
      if(color == 2)
	for(t=0;t<image->width - 1;t++)
	  liste_Of_Color[t] = 255 - donnee[image->width*ligne*3 + 2 + t*3];
 
  return liste_Of_Color;
}

  
void Profil::drawOnImage(ImageRgb *img,int *liste_intensite, int color){
  Point2D A(0,0);
  Point2D B(0,0);
  
  int k = 0;
  if(color == 0)
    for(k=1;k<img->width-1;k++){
    
      A.reset(k-1,liste_intensite[k-1]);
      B.reset(k,liste_intensite[k]);
      Segment2D segment(A,B);
      segment.draw(img,"red");
    }
  else
    if(color == 1)
      for(k=1;k<img->width-1;k++){
    
      A.reset(k-1,liste_intensite[k-1]);
      B.reset(k,liste_intensite[k]);
      Segment2D segment(A,B);
      segment.draw(img,"green");
    }
    else
      if(color == 2)
	for(k=1;k<img->width-1;k++){
    
      A.reset(k-1,liste_intensite[k-1]);
      B.reset(k,liste_intensite[k]);
      Segment2D segment(A,B);
      segment.draw(img,"blue");
    }
  }

  
 
 /*
  *unit = 0 pour image et 1 pour le profil d'intensite
  *
  *
  */

void Profil::saveImage(ImageRgb *img, int unit){
  DiskXFile *image_file;
  if(unit == 0)	
      image_file= new DiskXFile("imageT.ppm","w");
  else
    image_file = new DiskXFile("profile.ppm","w");	
  
  img->saveXFile(image_file);
  delete image_file;
  delete img;
  
 }

void Profil::drawLine(ImageRgb *image, int ligne,int color){
  
    if(ligne < image->height){
	//on fait ligne -1 parce que les lignes de l'image
// sont comptees a partir de 1  
	if(color == 0){
      	Point2D A(0,ligne-1);
      	Point2D B(image->width,ligne-1);
      	Segment2D segment2d(A,B);
      	segment2d.draw(image,"white"); 
	}
	else{
	Point2D A(0,ligne);
      	Point2D B(image->width,ligne);
      	Segment2D segment2d(A,B);
      	segment2d.draw(image,"black"); 
	}
   } 
}
void Profil::graduateImage(ImageRgb *img){
	int i = 50;
	drawLine(img,img->height-1,1);
	while(i< img->width){
		
		Point2D A(i,img->height);
		Point2D B(i,img->height-2);	
		Segment2D seg(A,B);
		seg.draw(img,"black");
		i= i + 50;		
		
	}
	Point2D A(0,0);
	Point2D B(0,img->height);
	Segment2D seg1(A,B);
	seg1.draw(img,"black"); 
	//on commence par placer le point de coordonnee (0,255) sur l'axe des ordonnees
	A.reset(0,5);
	B.reset(2,5);
	Segment2D seg2(A,B);
	seg2.draw(img,"black");
	
	i = 255;
	while(i > 50){
		
		Point2D A(0,255 -i);
		Point2D B(2,255 - i);	
		Segment2D seg(A,B);
		seg.draw(img,"black");
		i= i - 50;		
		
	}


}


  
 
